package com.aiassistant.controller;

import com.aiassistant.model.AIService;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.stage.FileChooser;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.geometry.Insets;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.concurrent.CompletableFuture;

/**
 * 主界面控制器类
 */
public class MainController implements Initializable {

    @FXML
    private TextArea userInputArea;
    
    @FXML
    private ScrollPane chatScrollPane;
    
    @FXML
    private VBox chatMessagesContainer;
    
    @FXML
    private Button sendButton;
    
    @FXML
    private Button uploadImageButton;
    
    @FXML
    private ProgressIndicator progressIndicator;
    
    // 侧边栏菜单项
    @FXML
    private VBox chatMenuItem;
    
    @FXML
    private VBox toolsMenuItem;
    
    @FXML
    private VBox profileMenuItem;
    
    @FXML
    private VBox settingsMenuItem;
    
    @FXML
    private VBox helpMenuItem;
    
    // 二级菜单容器
    @FXML
    private VBox subMenuContainer;

    private final AIService aiService = new AIService();
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        progressIndicator.setVisible(false);
        
        // 设置发送按钮图标
        try {
            loadButtonIcon(sendButton, "/com/aiassistant/images/send.png", "发送");
            loadButtonIcon(uploadImageButton, "/com/aiassistant/images/upload.png", "上传图片");
        } catch (Exception e) {
            System.err.println("加载按钮图标时出错: " + e.getMessage());
        }
        
        // 设置菜单项点击事件
        setupMenuItems();
        
        // 设置二级菜单项点击事件
        setupSubMenuItems();
        
        // 设置发送按钮点击事件
        sendButton.setOnAction(event -> sendMessage());
        
        // 设置上传图片按钮点击事件
        uploadImageButton.setOnAction(event -> uploadImage());
        
        // 回车键发送消息
        userInputArea.setOnKeyPressed(event -> {
            if (event.isControlDown() && event.getCode().toString().equals("ENTER")) {
                sendMessage();
                event.consume();
            }
        });
        
        // 添加欢迎消息
        Platform.runLater(() -> {
            addMessageToChat("AI助手", "你好！我是基于JavaFX开发的AI助手。请输入消息或上传图片，我会尽力提供帮助。", true);
        });
        
        // 默认选中聊天菜单
        setMenuActive(chatMenuItem);
    }
    
    /**
     * 设置菜单项点击事件
     */
    private void setupMenuItems() {
        chatMenuItem.setOnMouseClicked(event -> {
            setMenuActive(chatMenuItem);
            showChatView();
            updateSubMenu("chat");
        });
        
        toolsMenuItem.setOnMouseClicked(event -> {
            setMenuActive(toolsMenuItem);
            showToolsView();
            updateSubMenu("tools");
        });
        
        profileMenuItem.setOnMouseClicked(event -> {
            setMenuActive(profileMenuItem);
            showProfileView();
            updateSubMenu("profile");
        });
        
        settingsMenuItem.setOnMouseClicked(event -> {
            setMenuActive(settingsMenuItem);
            showSettingsView();
            updateSubMenu("settings");
        });
        
        helpMenuItem.setOnMouseClicked(event -> {
            setMenuActive(helpMenuItem);
            showHelpView();
            updateSubMenu("help");
        });
    }
    
    /**
     * 设置二级菜单项点击事件
     */
    private void setupSubMenuItems() {
        // 二级菜单项的点击事件将在动态创建菜单时设置
    }
    
    /**
     * 更新二级菜单内容
     * @param menuType 菜单类型
     */
    private void updateSubMenu(String menuType) {
        if (subMenuContainer == null) {
            System.err.println("二级菜单容器为空，无法更新菜单");
            return;
        }
        
        // 清空当前的二级菜单
        subMenuContainer.getChildren().clear();
        
        switch (menuType) {
            case "chat":
                createChatSubMenu();
                break;
            case "tools":
                createToolsSubMenu();
                break;
            case "profile":
                createProfileSubMenu();
                break;
            case "settings":
                createSettingsSubMenu();
                break;
            case "help":
                createHelpSubMenu();
                break;
            default:
                break;
        }
    }
    
    /**
     * 创建聊天二级菜单
     */
    private void createChatSubMenu() {
        // 模型服务分类
        Label modelLabel = new Label("模型服务");
        modelLabel.getStyleClass().add("category-label");
        modelLabel.setPadding(new Insets(10, 0, 5, 0));
        
        subMenuContainer.getChildren().add(modelLabel);
        
        // 添加模型服务项
        addSubMenuItem("模型服务", "/com/aiassistant/images/default/service.svg", e -> {
            addMessageToChat("AI助手", "模型服务功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("默认模型", "/com/aiassistant/images/default/model.svg", e -> {
            addMessageToChat("AI助手", "默认模型设置功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("网络搜索", "/com/aiassistant/images/default/search.svg", e -> {
            addMessageToChat("AI助手", "网络搜索功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("MCP 服务器", "/com/aiassistant/images/default/server.svg", e -> {
            addMessageToChat("AI助手", "MCP服务器设置功能即将推出，敬请期待！", true);
        });
    }
    
    /**
     * 创建工具二级菜单
     */
    private void createToolsSubMenu() {
        // 快捷工具分类
        Label toolsLabel = new Label("快捷工具");
        toolsLabel.getStyleClass().add("category-label");
        toolsLabel.setPadding(new Insets(10, 0, 5, 0));
        
        subMenuContainer.getChildren().add(toolsLabel);
        
        // 添加工具项
        addSubMenuItem("快捷方式", "/com/aiassistant/images/default/shortcut.svg", e -> {
            addMessageToChat("AI助手", "快捷方式功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("快捷助手", "/com/aiassistant/images/default/assistant.svg", e -> {
            addMessageToChat("AI助手", "快捷助手功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("快捷翻译", "/com/aiassistant/images/default/translate.svg", e -> {
            addMessageToChat("AI助手", "快捷翻译功能即将推出，敬请期待！", true);
        });
    }
    
    /**
     * 创建个人资料二级菜单
     */
    private void createProfileSubMenu() {
        // 个人资料分类
        Label profileLabel = new Label("个人资料");
        profileLabel.getStyleClass().add("category-label");
        profileLabel.setPadding(new Insets(10, 0, 5, 0));
        
        subMenuContainer.getChildren().add(profileLabel);
        
        // 添加个人资料项
        addSubMenuItem("个人信息", "/com/aiassistant/images/profile.svg", e -> {
            addMessageToChat("AI助手", "个人信息功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("数据设置", "/com/aiassistant/images/default/data.svg", e -> {
            addMessageToChat("AI助手", "数据设置功能即将推出，敬请期待！", true);
        });
    }
    
    /**
     * 创建设置二级菜单
     */
    private void createSettingsSubMenu() {
        // 设置分类
        Label settingsLabel = new Label("设置");
        settingsLabel.getStyleClass().add("category-label");
        settingsLabel.setPadding(new Insets(10, 0, 5, 0));
        
        subMenuContainer.getChildren().add(settingsLabel);
        
        // 添加设置项
        addSubMenuItem("常规设置", "/com/aiassistant/images/default/settings_general.svg", e -> {
            showSettingsView();
        });
        
        addSubMenuItem("显示设置", "/com/aiassistant/images/default/display.svg", e -> {
            addMessageToChat("AI助手", "显示设置功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("小工具设置", "/com/aiassistant/images/default/tools_small.svg", e -> {
            addMessageToChat("AI助手", "小工具设置功能即将推出，敬请期待！", true);
        });
        
        addSubMenuItem("关于我们", "/com/aiassistant/images/default/info.svg", e -> {
            showHelpView();
        });
    }
    
    /**
     * 创建帮助二级菜单
     */
    private void createHelpSubMenu() {
        // 帮助分类
        Label helpLabel = new Label("帮助中心");
        helpLabel.getStyleClass().add("category-label");
        helpLabel.setPadding(new Insets(10, 0, 5, 0));
        
        subMenuContainer.getChildren().add(helpLabel);
        
        // 添加帮助项
        addSubMenuItem("使用指南", "/com/aiassistant/images/help.svg", e -> {
            showHelpView();
        });
        
        addSubMenuItem("关于我们", "/com/aiassistant/images/default/info.svg", e -> {
            StringBuilder aboutInfo = new StringBuilder();
            aboutInfo.append("AI助手 v1.0\n\n");
            aboutInfo.append("一个基于JavaFX开发的AI助手应用程序\n");
            aboutInfo.append("支持文本聊天和图像分析功能\n\n");
            aboutInfo.append("© 2025 AI助手团队");
            
            addMessageToChat("AI助手", aboutInfo.toString(), true);
        });
    }
    
    /**
     * 添加子菜单项
     * @param text 菜单文本
     * @param iconPath 图标路径
     * @param action 点击动作
     */
    private void addSubMenuItem(String text, String iconPath, javafx.event.EventHandler<javafx.scene.input.MouseEvent> action) {
        HBox menuItem = new HBox(10);
        menuItem.getStyleClass().add("sub-menu-item");
        menuItem.setPadding(new Insets(8, 8, 8, 8));
        menuItem.setAlignment(javafx.geometry.Pos.CENTER_LEFT);
        
        // 加载图标
        ImageView iconView = new ImageView();
        iconView.setFitHeight(20);
        iconView.setFitWidth(20);
        
        try {
            InputStream iconStream = getClass().getResourceAsStream(iconPath);
            if (iconStream != null) {
                Image icon = new Image(iconStream);
                iconView.setImage(icon);
            } else {
                System.err.println("无法加载图标: " + iconPath);
            }
        } catch (Exception e) {
            System.err.println("加载图标时出错: " + e.getMessage());
        }
        
        // 创建标签
        Label label = new Label(text);
        label.getStyleClass().add("sub-menu-label");
        
        menuItem.getChildren().addAll(iconView, label);
        
        // 设置点击事件
        menuItem.setOnMouseClicked(action);
        
        subMenuContainer.getChildren().add(menuItem);
    }
    
    /**
     * 设置菜单项为激活状态
     */
    private void setMenuActive(VBox menuItem) {
        // 清除所有菜单项的激活样式
        for (Node node : menuItem.getParent().getChildrenUnmodifiable()) {
            if (node instanceof VBox && node.getStyleClass().contains("menu-item")) {
                node.getStyleClass().remove("menu-item-active");
                
                // 重置所有菜单项文本颜色
                VBox vbox = (VBox) node;
                for (Node child : vbox.getChildren()) {
                    if (child instanceof Label) {
                        Label label = (Label) child;
                        label.setTextFill(Color.valueOf("#757575"));
                    }
                }
            }
        }
        
        // 设置当前菜单项为激活状态
        menuItem.getStyleClass().add("menu-item-active");
        
        // 设置激活菜单项文本颜色
        for (Node child : menuItem.getChildren()) {
            if (child instanceof Label) {
                Label label = (Label) child;
                label.setTextFill(Color.valueOf("#4a86e8"));
            }
        }
    }
    
    /**
     * 显示聊天视图
     */
    private void showChatView() {
        try {
            // 获取主窗口中心区域的BorderPane
            Node parent = chatScrollPane.getParent();
            if (parent == null) {
                System.err.println("chatScrollPane的父节点为null，无法获取BorderPane");
                return;
            }
            
            // 检查父节点类型
            if (!(parent instanceof BorderPane)) {
                // 如果当前父节点不是BorderPane，尝试向上查找
                while (parent != null && !(parent instanceof BorderPane)) {
                    parent = parent.getParent();
                }
                
                if (parent == null) {
                    System.err.println("无法找到BorderPane父节点");
                    return;
                }
            }
            
            BorderPane mainContentPane = (BorderPane) parent;
            
            // 移除顶部的返回按钮
            mainContentPane.setTop(null);
            
            // 恢复聊天界面
            mainContentPane.setCenter(chatScrollPane);
            
            // 恢复输入区域
            VBox inputBox = new VBox();
            inputBox.setPadding(new Insets(10.0));
            
            // 添加上传图片按钮和进度指示器
            HBox topBar = new HBox(10);
            topBar.setPadding(new Insets(0, 0, 5, 0));
            topBar.setAlignment(javafx.geometry.Pos.CENTER_RIGHT);
            topBar.getChildren().addAll(progressIndicator, new Region(), uploadImageButton);
            HBox.setHgrow(topBar.getChildren().get(1), Priority.ALWAYS);
            
            // 添加输入框
            
            // 添加发送按钮和提示文本
            HBox bottomBar = new HBox(10);
            bottomBar.setPadding(new Insets(5, 0, 0, 0));
            bottomBar.setAlignment(javafx.geometry.Pos.CENTER_RIGHT);
            Label hintLabel = new Label("按Ctrl+Enter发送");
            hintLabel.setTextFill(Color.valueOf("#757575"));
            Region spacer = new Region();
            HBox.setHgrow(spacer, Priority.ALWAYS);
            bottomBar.getChildren().addAll(hintLabel, spacer, sendButton);
            
            // 组装输入区域
            inputBox.getChildren().addAll(topBar, userInputArea, bottomBar);
            
            // 设置到主界面
            mainContentPane.setBottom(inputBox);
            
            System.out.println("显示聊天视图");
        } catch (Exception e) {
            System.err.println("无法加载聊天视图: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 显示工具视图
     */
    private void showToolsView() {
        // 清除之前的消息提示
        // addMessageToChat("AI助手", "工具功能即将推出，敬请期待！", true);
        System.out.println("显示工具视图");
    }
    
    /**
     * 显示个人资料视图
     */
    private void showProfileView() {
        // 清除之前的消息提示
        // addMessageToChat("AI助手", "个人资料功能即将推出，敬请期待！", true);
        System.out.println("显示个人资料视图");
    }
    
    /**
     * 显示设置视图
     */
    private void showSettingsView() {
        try {
            // 加载设置视图FXML
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/aiassistant/view/settings.fxml"));
            Parent settingsRoot = loader.load();
            
            // 加载CSS样式
            settingsRoot.getStylesheets().add(getClass().getResource("/com/aiassistant/styles/settings.css").toExternalForm());
            
            // 获取主窗口中心区域的BorderPane
            Node parent = chatScrollPane.getParent();
            if (parent == null) {
                System.err.println("chatScrollPane的父节点为null，无法获取BorderPane");
                return;
            }
            
            // 检查父节点类型
            if (!(parent instanceof BorderPane)) {
                // 如果当前父节点不是BorderPane，尝试向上查找
                while (parent != null && !(parent instanceof BorderPane)) {
                    parent = parent.getParent();
                }
                
                if (parent == null) {
                    System.err.println("无法找到BorderPane父节点");
                    return;
                }
            }
            
            BorderPane mainContentPane = (BorderPane) parent;
            
            // 清除当前的中心和底部内容
            mainContentPane.setCenter(null);
            mainContentPane.setBottom(null);
            
            // 将设置页面内容放置到中心区域
            mainContentPane.setCenter(settingsRoot);
            
            // 设置恢复按钮（可选）
            Button backButton = new Button("返回聊天");
            backButton.getStyleClass().add("primary-button");
            backButton.setOnAction(e -> {
                // 使用showChatView方法恢复聊天界面
                setMenuActive(chatMenuItem); // 切换回聊天菜单高亮
                showChatView();
            });
            
            // 设置标题为设置
            Label titleLabel = new Label("设置");
            titleLabel.setStyle("-fx-font-size: 20px; -fx-font-weight: bold;");
            
            HBox headerBox = new HBox(10, backButton, titleLabel);
            headerBox.setAlignment(javafx.geometry.Pos.CENTER_LEFT);
            headerBox.setPadding(new Insets(10));
            headerBox.setStyle("-fx-background-color: #f5f5f5;");
            
            mainContentPane.setTop(headerBox);
            
            System.out.println("显示设置视图");
        } catch (Exception e) {
            System.err.println("无法加载设置视图: " + e.getMessage());
            e.printStackTrace();
            
            // 如果无法加载设置视图，显示提示信息
            addMessageToChat("AI助手", "加载设置界面失败，请稍后再试。", true);
        }
    }
    
    /**
     * 显示帮助视图
     */
    private void showHelpView() {
        // 显示帮助信息
        StringBuilder helpMessage = new StringBuilder();
        helpMessage.append("欢迎使用AI助手！以下是一些基本使用说明：\n\n");
        helpMessage.append("1. 聊天功能：在输入框中输入消息，按发送按钮或Ctrl+Enter发送\n");
        helpMessage.append("2. 图片识别：点击上传图片按钮可上传图片进行分析\n");
        helpMessage.append("3. 侧边菜单：通过左侧菜单可以切换不同功能\n\n");
        helpMessage.append("如需更多帮助，请联系开发者。");
        
        addMessageToChat("AI助手", helpMessage.toString(), true);
        System.out.println("显示帮助视图");
    }
    
    /**
     * 加载按钮图标
     */
    private void loadButtonIcon(Button button, String iconPath, String fallbackText) {
        try {
            InputStream iconStream = getClass().getResourceAsStream(iconPath);
            if (iconStream != null) {
                Image image = new Image(iconStream);
                ImageView imageView = new ImageView(image);
                imageView.setFitWidth(16);
                imageView.setFitHeight(16);
                button.setGraphic(imageView);
                System.out.println("成功加载图标: " + iconPath);
            } else {
                // 如果无法加载图标，只显示文本
                System.err.println("无法加载图标: " + iconPath + "，将只显示文本");
                button.setText(fallbackText);
            }
        } catch (Exception e) {
            System.err.println("加载图标时发生异常: " + e.getMessage());
            button.setText(fallbackText);
        }
    }
    
    /**
     * 发送消息
     */
    private void sendMessage() {
        String userMessage = userInputArea.getText().trim();
        if (userMessage.isEmpty()) {
            return;
        }
        
        // 添加用户消息到聊天界面
        addMessageToChat("用户", userMessage, false);
        
        // 清空输入框
        userInputArea.clear();
        
        // 显示加载指示器
        progressIndicator.setVisible(true);
        
        // 异步获取AI回复
        CompletableFuture.supplyAsync(() -> aiService.getResponse(userMessage))
                .thenAccept(aiResponse -> {
                    Platform.runLater(() -> {
                        // 添加AI回复到聊天界面
                        addMessageToChat("AI助手", aiResponse, true);
                        // 隐藏加载指示器
                        progressIndicator.setVisible(false);
                    });
                });
    }
    
    /**
     * 上传图片
     */
    private void uploadImage() {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("选择图片");
        fileChooser.getExtensionFilters().addAll(
                new FileChooser.ExtensionFilter("图片文件", "*.png", "*.jpg", "*.jpeg", "*.gif")
        );
        
        File selectedFile = fileChooser.showOpenDialog(uploadImageButton.getScene().getWindow());
        if (selectedFile != null) {
            // 显示加载指示器
            progressIndicator.setVisible(true);
            
            // 添加图片消息到聊天界面
            addImageToChat("用户", selectedFile.getAbsolutePath());
            
            // 异步处理图片并获取AI回复
            CompletableFuture.supplyAsync(() -> aiService.analyzeImage(selectedFile))
                    .thenAccept(aiResponse -> {
                        Platform.runLater(() -> {
                            // 添加AI回复到聊天界面
                            addMessageToChat("AI助手", aiResponse, true);
                            // 隐藏加载指示器
                            progressIndicator.setVisible(false);
                        });
                    });
        }
    }
    
    /**
     * 添加文本消息到聊天界面
     */
    private void addMessageToChat(String sender, String message, boolean isAI) {
        Label senderLabel = new Label(sender + ":");
        senderLabel.getStyleClass().add("sender-label");
        
        // 设置发送者图标
        try {
            String iconPath = isAI ? "/com/aiassistant/images/ai.png" : "/com/aiassistant/images/user.png";
            InputStream iconStream = getClass().getResourceAsStream(iconPath);
            if (iconStream != null) {
                Image senderImage = new Image(iconStream);
                ImageView senderImageView = new ImageView(senderImage);
                senderImageView.setFitWidth(24);
                senderImageView.setFitHeight(24);
                senderLabel.setGraphic(senderImageView);
            }
        } catch (Exception e) {
            System.err.println("加载发送者图标时出错: " + e.getMessage());
        }
        
        TextArea messageArea = new TextArea(message);
        messageArea.setEditable(false);
        messageArea.setWrapText(true);
        messageArea.getStyleClass().add(isAI ? "ai-message" : "user-message");
        
        VBox messageBox = new VBox(5, senderLabel, messageArea);
        messageBox.getStyleClass().add("message-box");
        
        chatMessagesContainer.getChildren().add(messageBox);
        
        // 自动滚动到底部
        chatScrollPane.setVvalue(1.0);
    }
    
    /**
     * 添加图片消息到聊天界面
     */
    private void addImageToChat(String sender, String imagePath) {
        Label senderLabel = new Label(sender + ":");
        senderLabel.getStyleClass().add("sender-label");
        
        // 设置发送者图标
        try {
            InputStream iconStream = getClass().getResourceAsStream("/com/aiassistant/images/user.png");
            if (iconStream != null) {
                Image senderImage = new Image(iconStream);
                ImageView senderImageView = new ImageView(senderImage);
                senderImageView.setFitWidth(24);
                senderImageView.setFitHeight(24);
                senderLabel.setGraphic(senderImageView);
            }
        } catch (Exception e) {
            System.err.println("加载发送者图标时出错: " + e.getMessage());
        }
        
        ImageView imageView = new ImageView(new Image("file:" + imagePath));
        imageView.setFitWidth(300);
        imageView.setPreserveRatio(true);
        
        VBox messageBox = new VBox(5, senderLabel, imageView);
        messageBox.getStyleClass().add("message-box");
        
        chatMessagesContainer.getChildren().add(messageBox);
        
        // 自动滚动到底部
        chatScrollPane.setVvalue(1.0);
    }
} 